from flask import Blueprint,request,jsonify
#密码加密
from werkzeug.security import generate_password_hash,check_password_hash
from conf.comm import sqlalchemy_context
from database import *
import json
import re
import random
from utils.comm import send_message
from utils.redisconn import r
import database
import time

# jwt导包
from utils.jwt_token import mytoken

#蓝图初始化
bp_users = Blueprint('users',__name__)
#注册功能实现
@bp_users.route('/reg',methods=['POST'])
@sqlalchemy_context()
def reg():
    #获取用户输入
    data = request.data
    if not data:
        data = request.form
    else:
        data = json.loads(data)
    #有效性验证，正则验证手机号
    reg = re.match('^1[3-9]\d{9}$',data['mobile'])
    if not reg:
        return jsonify({"code":10012,'mes':'手机号不合法'})
    #构造user
    try:
         user = User(username=data['username'],password=generate_password_hash(data['password']),mobile=data['mobile'])
         db.session.add(user)
         db.session.commit()
         return jsonify({"code":200})
    except:
        return jsonify({"code":10010}) 

#发送验证码
@bp_users.route('/sendsms',methods=['POST'])
def sendsms():
    #传递手机号
    data = request.data
    if data:
        data = json.loads(data)
    else:
        data = request.form
    mobile = data['mobile']
    #有效性验证，正则验证手机号
    reg = re.match('^1[3-9]\d{9}$',data['mobile'])
    if not reg:
        return jsonify({"code":10012,'mes':'手机号不合法'})
    #生成验证码
    code = str(random.randint(100000,999999))
    #调用短信接口
    flag = send_message(mobile,code,1)
    if flag:
        #发送成功，存入redis
        r.set_str(mobile,code,60)
        #返回结果（验证码）
        return jsonify({'code':200,'smscode':code})
    else:
        return jsonify({'code':20011,'mes':'发送失败，请重试'})

 # 手机号登录  
@bp_users.route('/login',methods=['POST'])
def login():
    #获取用户输入
    data = request.data
    if data:
        data = json.loads(data)
    else:
        data = request.form
    mobile = data['mobile']
    #用户输入的验证码
    code = data['code']
    # 通过手机号redis查
    rcode = r.get_str(mobile)
    # 存在值对比-》
    if rcode:
        if int(code) == int(rcode):
            # 用手机号生成一个新用户
            user = User.query.filter_by(mobile=mobile).first()
            #用户不存在添加
            if not user:
                user = User(username=mobile,mobile=mobile)
                db.session.add(user)
                db.session.commit()
                #清除redis
            r.del_str(mobile)
            # 返回结果（pyjwt生成token）
            return jsonify({"code":200,'userid':user.id,'username':user.username})
        else:
            #不存在返回
            return jsonify({"code":20013,'mes':'验证码错误，请重新输入'})
    else:
	    #不存在返回
        return jsonify({"code":20012,'mes':'验证码不存在，请重新发送'})


# 用户名登录
@bp_users.route('/user_login',methods=['POST','GET'])
@sqlalchemy_context()
def user_login():
    # 获取用户输入
    data=json.loads(request.data)
    # 获取用户名
    username = data['username']
    # 获取密码
    password = data['password']
    # 通过用户名过滤信息 赋值给user
    user=User.query.filter_by(username=username).first()
    # 如果user存在的话
    if user:
        if check_password_hash(user.password,password):
            token=mytoken.encode_jwt({'id':user.id})
            return jsonify({'code':200,'token':token,'userid':user.id})
        
        else:
            record=Record.query.filter_by(username=username).first()
            if not record:
                record=Record(username=username,total=1)
                db.session.add(record)
                db.session.commit()
            else:
                time1=datetime.datetime.now()
                time2=record.strattime.timestamp()/3600

                print(time1,'---',time2)
                if time1.timestamp()/3600-time2>24:
                    Record.query.filter_by(username=username).update({'total':0,'strattime':time1})
                    db.session.commit()

                if record.total<3:
                    Record.query.filter_by(username=username).update({'total':record.total+1})
                    db.session.commit()

                else:
                    return jsonify({'code':12345,'mes':'密码一天只能输入三次'})
            
            return jsonify({'code':10010,'mes':'密码错误'})
    else:
        return jsonify({'code':20010,'mes':'用户名不存在'})